/**
 * nestjs 中有三种参数
 *  param: restful api 参数
 *  query: url 查询参数
 *  body: Post 请求体参数
 */

import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
  Query,
  UseFilters,
} from "@nestjs/common";
import { AppService } from "./app.service";
import { TestService } from "./test.service";
import { HttpExceptionFilter } from "./exception/http-exception.filter";

type GetDataParams = {
  id: string;
  name: string;
};

type AddDataBody = {
  a: string;
  b: string;
  id: string;
};

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    private readonly testService: TestService,
  ) {}

  @Get("/")
  getHello(): string {
    return this.appService.getHello();
  }

  @Get("/test")
  getTest(): string {
    return "test";
  }

  /**
   * Restful API是一种规范，而不是一种技巧
   * CRUD: Create(创建), Read(读取), Update(更新), Delete(删除)
   * Get: 获取资源
   * Post: 创建资源
   * Put: 更新资源
   * Delete: 删除资源
   * @returns
   */

  /**
   * Turbo console log 插件的快捷方式
   * 插入日志消息：ctrl + alt + L
   * 注释插入的日志消息：ctrl + alt + C
   * 取消注释日志消息：ctrl + alt + U
   * 删除日志消息： ctrl + alt + D
   * @param params
   * @returns
   */

  // 根据 id 获取数据
  // @Get('/data/:id/name/:name')
  @Get("/data/:subId/name/:name") // 测试自定义异常
  @UseFilters(new HttpExceptionFilter())
  getData(@Param() params: GetDataParams): string {
    return this.testService.getData(params);
  }

  // 获取所以数据
  @Get("data")
  getAllData(): string {
    return this.testService.getAllData();
  }

  // 创建数据
  @Post("/data")
  addData(@Body() body: AddDataBody, @Query() query: AddDataBody): string {
    return this.testService.addData(body, query);
  }

  // 更新数据
  @Put("/data/")
  updateData(@Body() body: AddDataBody): string {
    return this.testService.updateData(body);
  }

  // 删除数据
  @Delete("/data/:id")
  deleteData(@Param() params: GetDataParams): string {
    return this.testService.deleteData(params);
  }
}
